<?php

namespace App\Http\Controllers\Landscaping;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Landscaping\ParkVegetation;
use App\Models\Landscaping\ParkVegetationFile;
use Illuminate\Database\QueryException;
use App\Http\Requests\Landscaping\ParkVegetationRequest;
use Grimzy\LaravelMysqlSpatial\Types\Point;
use Grimzy\LaravelMysqlSpatial\Types\Polygon;
use Illuminate\Support\Facades\DB;

/**
 * @group 基础信息管理->绿化->植被信息库->植被信息
 *
 * 采用 restful api
 *
 * Body Parameters 表示请求的所需要的参数
 *
 * Query Parameters 表示返回参数的名称
 */

class ParkVegetationController extends Controller
{
    /**
     * 绿化基础数据列表
     *
     * @bodyParam park_name string 绿化名称
     * @bodyParam vegetation_name string 植被名称
     * @bodyParam location point 点信息 115.24556 25.14551
     * @bodyParam areas Polygon 面信息 (0 0,4 0,4 4,0 4,0 0)
     *
     * @queryParam landscaping->park_name string 区域名称
     * @queryParam landscaping->park_number int 编号
     * @queryParam landscaping->yh_areas string 养护面积
     * @queryParam landscaping->level int 养护等级 0一级 1二级 2三级
     * @queryParam vegetation->name string 植被类型
     * @queryParam name string 植被名称
     * @queryParam version string 植被规模
     * @queryParam unit string 计量单位
     * @queryParam number int 数量
     * @queryParam sign string 生长情况
     * @queryParam location point 点信息 115.24556 25.14551
     * @queryParam areas Polygon 面信息 (0 0,4 0,4 4,0 4,0 0)
     * @queryParam files->file->local_url string 附件url地址
     */
    public function index(Request $request)
    {
        $parkVegetation = new ParkVegetation;
        $data = $parkVegetation->getList($request);
        return response()->json(encodeMsg($data,200));
    }

    /**
     * 新增绿化基础数据
     *
     * @bodyParam name string required 植被名称
     * @bodyParam landscaping_id int required 绿化名称id 外键 园林基础数据表
     * @bodyParam vegetation_id int required 植被类型id 外键 植被种类表
     * @bodyParam version string required 植被规模
     * @bodyParam unit string required 计量单位
     * @bodyParam number int required 数量
     * @bodyParam sign string required 生长情况
     * @bodyParam location point 点信息 115.24556 25.14551
     * @bodyParam areas Polygon 面信息 (0 0,4 0,4 4,0 4,0 0)
     * @bodyParam virescence_ids string 附件ids:1,2,3
     *
     * @queryParam name string 植被名称
     * @queryParam landscaping_id int 绿化名称id 外键 园林基础数据表
     * @queryParam vegetation_id int 植被类型id 外键 植被种类表
     * @queryParam version string 植被规模
     * @queryParam unit string 计量单位
     * @queryParam number int 数量
     * @queryParam sign string 生长情况
     * @queryParam location point 点信息 115.24556 25.14551
     * @queryParam areas Polygon 面信息 (0 0,4 0,4 4,0 4,0 0)
     * @queryParam virescence_ids string 附件ids:1,2,3
     */
    public function store(Request $request)
    {
        DB::beginTransaction();
        try {
            $data = $request->all();
            $location = $request->input('location','');
            $areas = $request->input('areas','');
            if(!empty($location)){
                $data['location'] = Point::fromString($location);
            }
            if(!empty($areas)){
                $data['areas'] = Polygon::fromString($areas);
            }
            $data = ParkVegetation::create($data);
            if($request->has('virescence_ids')){
                $file_data = [];
                $fileArr = explode(',',$request->get('virescence_ids'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['v_id'] = $data->id;
                    array_push($file_data,$tmp);
                }
                try{
                    ParkVegetationFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复".$e->getMessage()],404), 404);
                }
            }
            DB::commit();
            return response()->json(encodeMsg($data,201));
        } catch (QueryException $e) {
            DB::rollBack();
            // dd($e);
            return response()->json(encodeMsg(['message' => '数据添加失败!'],400));
        }
    }

    /**
     * 查看绿化基础数据
     *
     * @bodyParam id int 植被名称
     *
     * @queryParam name string 植被名称
     * @queryParam landscaping_id int 绿化名称id 外键 园林基础数据表
     * @queryParam landscaping->park_name string 区域名称
     * @queryParam landscaping->park_number int 编号
     * @queryParam landscaping->yh_areas string 养护面积
     * @queryParam landscaping->level int 养护等级 0一级 1二级 2三级
     * @queryParam vegetation_id int 植被类型id 外键 植被种类表
     * @queryParam vegetation->name string 植被类型
     * @queryParam version string 植被规模
     * @queryParam unit string 计量单位
     * @queryParam number int 数量
     * @queryParam sign string 生长情况
     * @queryParam location point 点信息 115.24556 25.14551
     * @queryParam areas Polygon 面信息 (0 0,4 0,4 4,0 4,0 0)
     * @queryParam files->file->local_url string 附件url地址
     */
    public function show($id)
    {
        //创建模型
        $parkVegetation = ParkVegetation::with(['vegetation','landscaping','files'])->find($id);
        if($parkVegetation == []) {
            return response()->json(encodeMsg(["message" => "没有该绿化基础数据信息!"], 404));
        } else {
            return response()->json(encodeMsg($parkVegetation,200));
        }
    }

    /**
     * 修改绿化基础数据
     *
     * @bodyParam id int 植被名称
     * @bodyParam name string required 植被名称
     * @bodyParam landscaping_id int required 绿化名称id 外键 园林基础数据表
     * @bodyParam vegetation_id int required 植被类型id 外键 植被种类表
     * @bodyParam version string required 植被规模
     * @bodyParam unit string required 计量单位
     * @bodyParam number int required 数量
     * @bodyParam sign string required 生长情况
     * @bodyParam location point 点信息 115.24556 25.14551
     * @bodyParam areas Polygon 面信息 (0 0,4 0,4 4,0 4,0 0)
     * @bodyParam virescence_ids string 附件ids:1,2,3
     *
     * @queryParam name string 植被名称
     * @queryParam landscaping_id int 绿化名称id 外键 园林基础数据表
     * @queryParam vegetation_id int 植被类型id 外键 植被种类表
     * @queryParam version string 植被规模
     * @queryParam unit string 计量单位
     * @queryParam number int 数量
     * @queryParam sign string 生长情况
     * @queryParam location point 点信息 115.24556 25.14551
     * @queryParam areas Polygon 面信息 (0 0,4 0,4 4,0 4,0 0)
     * @queryParam virescence_ids string 附件ids:1,2,3
     */
    public function update(Request $request, $id)
    {
        //创建模型
        $parkVegetation = ParkVegetation::find($id);
        if($parkVegetation == []) {
            return response()->json(encodeMsg(["message" => "没有该绿化基础数据信息!"], 404));
        }
        DB::beginTransaction();
        try {
            $data = $request->all();
            $location = $request->input('location','');
            $areas = $request->input('areas','');
            if(!empty($location)){
                $data['location'] = Point::fromString($location);
            }
            if(!empty($areas)){
                $data['areas'] = Polygon::fromString($areas);
            }
            if($request->has('virescence_ids')){
                $origin_files = ParkVegetationFile::where('v_id',$id)->get()->toArray();//图片原来的id号是好多 取出
                $origin_file_ids = array();//这个数组用于报错以前的所有file的id号
                if($origin_files != []){
                    foreach ($origin_files as $v){
                        array_push($origin_file_ids,$v['id']);
                    }
                }
                $file_data = [];
                $fileArr = explode(',',$request->get('virescence_ids'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['v_id'] = $id;
                    array_push($file_data,$tmp);
                }
                try{
                    ParkVegetationFile::whereIn('id',$origin_file_ids)->delete();
                    ParkVegetationFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复".$e->getMessage()],404), 404);
                }
            }
            $parkVegetation->update($data);
            DB::commit();
            return response()->json(encodeMsg($parkVegetation,200));
        } catch (QueryException $e) {
            DB::rollBack();
            // dd($e);
            return response()->json(encodeMsg(['message' => '数据修改失败!'],400));
        }
    }

    /**
     * 删除绿化基础数据
     *
     * @bodyParam id int required  表ID
     * @response 204 {
     *   "message": "删除成功"
     * }
     *
     *
     * @response 404 {
     *  "message": "没有该绿化数据信息"
     * }
     */
    public function destroy($id)
    {
        //创建模型
        $parkVegetation = ParkVegetation::find($id);
        if($parkVegetation == []) {
            return response()->json(encodeMsg(["message" => "没有该绿化基础数据信息!"], 404));
        }
        if($parkVegetation->delete()) {
            return response()->json(encodeMsg(["message" => "删除成功"], 204));
        } else {
            return response()->json(encodeMsg(["message" => "删除失败"], 400));
        }
    }

    /**
     * 批量删除绿化基础数据
     *
     * @bodyParam  ids int required  id集合字符串[格式：ids=1,2,3]
     * @response 204 {
     *   "message": "删除成功"
     * }
     *
     *
     */
    public function delete($ids)
    {
        $listId = explode(',', $ids);
        foreach ($listId as $id) {
        }
        ParkVegetation::whereIn('id',$listId)->delete();
        return response()->json(encodeMsg(["message" => "删除成功!"], 204));
    }
}
